﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Dominio.Entidades;
using Dominio.Logica;
using System.Reflection;
using InterfazPublica;

namespace Interfaz
{
    public partial class ABMEntidadesJuego : Form
    {
        int opcion;

        public ABMEntidadesJuego()
        {
            InitializeComponent();
        }

        public ABMEntidadesJuego(int opcion)
        {
            this.opcion = opcion;
            InitializeComponent();
        }

        private void btnImportar_Click(object sender, EventArgs e)
        {
            string ruta = "";
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Biblioteca de Archivos |*.dll";
            openFileDialog.ShowDialog();
            ruta = ruta + openFileDialog.FileName;
            openFileDialog.FileName = "";
            txtRutaAssembly.Text = ruta;
        }

        private void btnGuardarEntidad_Click(object sender, EventArgs e)
        {
            Juegos juego = new Juegos();
 
            AgenciaEntities contexto = Contexto.GetContexto();
            string rutaAssembly = txtRutaAssembly.Text.ToString();
            try
            {
                Assembly a = Assembly.LoadFile(rutaAssembly);
                bool carga = false;
                string NombreJuego = null;
                foreach (Type i in a.GetTypes())
                {
                    if (typeof(IJuegos).IsAssignableFrom(i))
                    {
                        juego.Descripcion = i.Name;
                        NombreJuego = i.Name;
                        juego.RutaAssembly = txtRutaAssembly.Text.ToString();
                        juego.Activo = true;
                        //compruebo si ya no existe en la BD
                        if (!(juego.Exists()))
                        {
                            carga = true;
                            juego.GuardarJuego();
                        }
                        else
                        {
                            Log.Grabar("ERROR: No se puede cargar el juego: " + NombreJuego + " porque ya existe, acción realizada por usuario: " + Agencia.UsuarioLogueado);
                            MessageBox.Show("No puede agregar un juego ya cargado.", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Error);

                        }
                    }
                }
                if (!carga)
                {
                    Log.Grabar("ERROR: No se puede cargar el juego: " + NombreJuego + " ,no tiene una interfaz válida , acción realizada por usuario: " + Agencia.UsuarioLogueado);
                    MessageBox.Show("No se puede cargar, juego inválido.", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    Log.Grabar("OK: Se ha cargado correctamente el juego: " + NombreJuego + " Acción realizada por usuario: " + Agencia.UsuarioLogueado);
                    MessageBox.Show("Se ha guardado el juego: " + NombreJuego + " correctamente", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                }

                Contexto.GetContexto().SaveChanges();
            }
            catch (BadImageFormatException) 
            {
                Log.Grabar("ERROR: Se ha intentado cargar una dll no válida, Acción realizada por usuario: " + Agencia.UsuarioLogueado);
                MessageBox.Show("No se puede cargar este juego, archivo no valido: " , "Atención", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void ABMEntidadesJuego_Load(object sender, EventArgs e)
        {
            switch (opcion)
            {
                case 1: //Alta Jueog
                    CargaAltaJuegos();
                    break;
                case 2: //Baja Juego
                    CargaBajaJuegos();
                    break;
            }
        }

        private void CargaAltaJuegos()
        {
            btnGuardarEntidad.Visible = true;
            btnBorrar.Visible = false;
            pictureBox1.Visible = true;
            pictureBox2.Visible = false;
            pictureBox3.Visible = false;
            label1.Visible = true;
            label3.Visible = false;
            label4.Visible = false;
            comboBox1.Enabled = false;
            comboBox1.Visible = false;
            comboBox2.Visible = false;
        }

        private void CargaBajaJuegos() 
        {
            pictureBox1.Visible = false;
            pictureBox2.Visible = false;
            pictureBox3.Visible = true;
            label1.Visible = false;
            label3.Visible = true;
            comboBox1.Visible = true;
            txtRutaAssembly.Visible = false;
            label2.Visible = false;
            btnImportar.Visible = false;
            comboBox2.Visible = false;
            label4.Visible = false;
            comboBox1.DataSource = Agencia.ListaJuegos;
            btnGuardarEntidad.Visible = false;
            btnBorrar.Visible = true;
        }

        private void btnBorrar_Click(object sender, EventArgs e)
        {
            Juegos j = (Juegos)comboBox1.SelectedItem;
            j.BajaJuego();
            
        }
    }
}
